<?php
namespace App\Utils;

use Exception;

class CRC16 {

    /**
     * @param  string   二进制数据
     * @return crc16 校验码
     */
    public static function crc16($data)
    {
        try{

            $crc = 0xFFFF;
            for ($i = 0; $i < strlen($data); $i++)
            {
                $crc ^=ord($data[$i]);
             
                for ($j = 8; $j !=0; $j--)
                {
                    if (($crc & 0x0001) !=0)
                    {
                        $crc >>= 1;
                        $crc ^= 0xA001;
                    }
                    else
                        $crc >>= 1;
                }
            }
            return $crc;
        }catch(Exception $e){
            logger(['CRC16@crc16' => [
                'code' => $e->getCode(),
                'message' => $e->getMessage(),
                ]]);
        }
    }

    /**
     * @param  string   二进制数据
     * @param  string   二进制 crc16 校验码
     * @return boolean  校验结果
     */
    public static function check($checkData, $checkCode)
    {
        $recrc = (ord($checkCode[0])<<8)|(ord($checkCode[1]));
        $crc = self::crc16($checkData);
        return ($recrc == $crc);
    }

    
}